/**
 * Copyright (C), 2015-2018, 真格邦软件科技有限公司
 * 文件名: WebLogAspect
 * 作者: lsyzx【892366102@qq.com】
 * 创建时间: 2019/1/1 04:09
 * 描述: TODO
 * 历史修改:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package com.zgb.manager.config;

import cn.hutool.core.util.ObjectUtil;
import com.zx.utils.vo.ApiResult;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;

/**
 * 作者: lsyzx【892366102@qq.com】
 * 创建时间: 2019/1/1 04:09
 * 描述:Open API 日志
 * 历史修改:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
@Aspect
@Component
@Slf4j
public class WebLogAspect {

    ThreadLocal<Long> startTime = new ThreadLocal();

    @Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
    public void webLog() {
    }

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) {
        startTime.set(System.currentTimeMillis());
        // 接收到请求，记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        // 记录下请求内容
        log.info("请求URL : {}", request.getRequestURL().toString());
        log.info("请求类型 : {}", request.getMethod());
        log.info("请求地址 : {}", request.getRemoteAddr());
        log.info("请求方法 : {}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        log.info("请求参数 : {}", Arrays.toString(joinPoint.getArgs()));
    }

    @AfterReturning(returning = "response", pointcut = "webLog()")
    public void doAfterReturning(Object response) throws Throwable {
        //处理完返回内容
        if (response instanceof ApiResult) {
            ApiResult apiResult = (ApiResult) response;
            log.info("响应信息 :{} ", ObjectUtil.isNull(apiResult.getData()) ? "" : apiResult.getData().toString());
        } else {
            log.info("响应信息 :{} ", ObjectUtil.isNull(response) ? "" : response.toString());
        }
        log.info("请求时间 : {}", (System.currentTimeMillis() - startTime.get()));
    }
}
